package example.day02;

/**
 * @author 涛哥
 * @nick_name "man deep as the sea"
 * @contact qq:657270652 wx:doit_edu
 * @site www.doitedu.cn
 * @date 2021-03-02
 * @desc 变量相关语法的示例代码
 */
public class _01_变量语法Demo {
    public static void main(String[] args) {
        // 定义一个int类型的变量，并赋值为10
        int a1 = 10;

        // 对已经定义过的变量，重新赋值
        a1 = 20;
        System.out.println(a1);  // 20

        // 定义一个byte类型的变量 [-128,+127]
        byte b1 = 5;   // 5 默认来说是int类型，但是因为它在byte的范围之内，编译器会自动通过（隐式转换类型）
        byte b2 = (byte)128;  // 128，编译器不再给你隐式转换，需要你显式强转才能编译通过，但是结果会溢出
        System.out.println(b1); // 5
        System.out.println(b2); // -128


        // 定义一个short类型的变量[-2^15 , +(2^15)-1] ==> [-32768,32767]
        short s1 = 10;
        short s2 = (short)32768;
        System.out.println(s1);
        System.out.println(s2);  // -32768

        // 定义一个int类型的变量[-2^31, 2^31 -1]
        // int i1 = 49827529375; // 这里的错误是， 49827529375数据本身不合法（它超出了int的最大值）
        // int i1 = 49827529375L; // 这里的错误是， 49827529375L本身合法，因为L表示它是一个long类型的数据，但是赋值语句的左右两边类型不一致
        int i1 = (int)49827529375L; // 不报错，但是不代表正确，实际上，i1的值肯定不是49827529375，它已经溢出了

        // 定义一个long类型的变量
        long l1 = 100000;  // 右边的数据本身是一个int类型，左边的变量是long类型，小范围的值赋给大范围的变量，没问题
        long l2 = 1000000L; // 右边的数据本身是一个long类型，左边变量也是long类型，没毛病

        // 将一个double数据赋给一个long的变量，只能强转，有可能会溢出
        long l3 = (long)98000000000000000000000000000000000000000000000000000000000000000000d;
    }
}
